package com.bawei.module_open.module

import android.content.Context
import android.media.MediaRecorder
import android.util.Log
import java.io.File

/**
 * MediaRecorder 辅助类
 * 用于诊断和解决录制问题
 */
object MediaRecorderHelper {
    
    private const val TAG = "MediaRecorderHelper"
    
    /**
     * 检查设备支持的录制参数
     */
    fun checkDeviceCapabilities(context: Context) {
        Log.i(TAG, "=== 设备录制能力检查 ===")
        
        // 检查存储空间
        val storageDir = context.getExternalFilesDir(null)
        val freeSpace = storageDir?.freeSpace ?: 0
        val totalSpace = storageDir?.totalSpace ?: 0
        Log.i(TAG, "存储空间: ${freeSpace / 1024 / 1024}MB 可用 / ${totalSpace / 1024 / 1024}MB 总计")
        
        if (freeSpace < 100 * 1024 * 1024) { // 小于100MB
            Log.w(TAG, "警告: 存储空间不足，可能影响录制")
        }
        
        // 检查目录权限
        val testDir = File(storageDir, "test")
        val canWrite = testDir.mkdirs()
        if (canWrite) {
            testDir.delete()
            Log.i(TAG, "目录写入权限: 正常")
        } else {
            Log.e(TAG, "目录写入权限: 失败")
        }
    }
    
    /**
     * 创建安全的 MediaRecorder 配置
     */
    fun createSafeMediaRecorder(outputFile: String): MediaRecorder? {
        return try {
            val recorder = MediaRecorder()
            
            // 基本配置（按顺序）
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC)
            recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA)
            recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
            recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT)
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT)
            recorder.setOutputFile(outputFile)
            
            // 安全设置视频参数
            setSafeVideoParameters(recorder)
            
            // 安全设置音频参数
            setSafeAudioParameters(recorder)
            
            recorder
        } catch (e: Exception) {
            Log.e(TAG, "创建 MediaRecorder 失败: ${e.message}")
            null
        }
    }
    
    /**
     * 安全设置视频参数
     */
    private fun setSafeVideoParameters(recorder: MediaRecorder) {
        // 尝试设置视频尺寸
        val videoSizes = arrayOf(
            intArrayOf(640, 480),   // VGA
            intArrayOf(720, 1280),  // 目标尺寸
            intArrayOf(480, 640),   // 备用尺寸
            intArrayOf(320, 240)    // 最小尺寸
        )
        
        for (size in videoSizes) {
            try {
                recorder.setVideoSize(size[0], size[1])
                Log.i(TAG, "视频尺寸设置成功: ${size[0]}x${size[1]}")
                break
            } catch (e: Exception) {
                Log.w(TAG, "视频尺寸设置失败: ${size[0]}x${size[1]}, ${e.message}")
            }
        }
        
        // 尝试设置帧率
        val frameRates = intArrayOf(15, 24, 30)
        for (fps in frameRates) {
            try {
                recorder.setVideoFrameRate(fps)
                Log.i(TAG, "帧率设置成功: ${fps}fps")
                break
            } catch (e: Exception) {
                Log.w(TAG, "帧率设置失败: ${fps}fps, ${e.message}")
            }
        }
        
        // 尝试设置码率
        val bitRates = intArrayOf(1000000, 2000000, 500000)
        for (bitRate in bitRates) {
            try {
                recorder.setVideoEncodingBitRate(bitRate)
                Log.i(TAG, "码率设置成功: ${bitRate}bps")
                break
            } catch (e: Exception) {
                Log.w(TAG, "码率设置失败: ${bitRate}bps, ${e.message}")
            }
        }
    }
    
    /**
     * 安全设置音频参数
     */
    private fun setSafeAudioParameters(recorder: MediaRecorder) {
        try {
            recorder.setAudioChannels(2)
            Log.i(TAG, "音频声道设置成功: 2")
        } catch (e: Exception) {
            Log.w(TAG, "音频声道设置失败: ${e.message}")
        }
        
        try {
            recorder.setAudioSamplingRate(44100)
            Log.i(TAG, "音频采样率设置成功: 44.1kHz")
        } catch (e: Exception) {
            Log.w(TAG, "音频采样率设置失败: ${e.message}")
        }
        
        try {
            recorder.setAudioEncodingBitRate(128000)
            Log.i(TAG, "音频码率设置成功: 128kbps")
        } catch (e: Exception) {
            Log.w(TAG, "音频码率设置失败: ${e.message}")
        }
    }
    
    /**
     * 检查录制文件是否有效
     */
    fun isVideoFileValid(filePath: String): Boolean {
        val file = File(filePath)
        if (!file.exists()) {
            Log.e(TAG, "视频文件不存在: $filePath")
            return false
        }
        
        if (file.length() == 0L) {
            Log.e(TAG, "视频文件为空: $filePath")
            return false
        }
        
        if (file.length() < 1024) { // 小于1KB
            Log.w(TAG, "视频文件过小，可能录制失败: ${file.length()} bytes")
            return false
        }
        
        Log.i(TAG, "视频文件有效: ${file.length()} bytes")
        return true
    }
    
    /**
     * 获取常见错误的原因
     */
    fun getErrorMessage(error: String): String {
        return when {
            error.contains("start failed") -> "录制启动失败，可能是参数设置问题或设备不支持"
            error.contains("prepare failed") -> "录制准备失败，检查文件路径和权限"
            error.contains("setVideoSize") -> "视频尺寸设置失败，设备不支持该分辨率"
            error.contains("setVideoFrameRate") -> "帧率设置失败，设备不支持该帧率"
            error.contains("setVideoEncodingBitRate") -> "码率设置失败，设备不支持该码率"
            error.contains("Permission") -> "权限不足，请检查相机和存储权限"
            else -> "未知错误: $error"
        }
    }
} 